Supplementary text S1
Local correlates of municipality-level excess mortality in Switzerland in 2020
Data
# A tibble: 9 × 9
`Age group` Sex Observed `Expected (median)` `Expected (lower bound)` `Expected (upper bound)`
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 40-59 Female 1713 1769 1642 1895
2 40-59 Male 2966 2230 2074 2396
3 60-69 Female 2611 2592 2421 2753
4 60-69 Male 4478 3201 3013 3449
5 70-79 Female 6203 5028 4708 5376
6 70-79 Male 8972 5953 5615 6310
7 80+ Female 27541 17205 16453 18284
8 80+ Male 20292 17677 16791 18900
9 Total Total 74776 55676 53865 57821
# ℹ 3 more variables: `Ratio (median)` <dbl>, `Ratio (lower bound)` <dbl>,
# `Ratio (upper bound)` <dbl>
Models of observed and expected deaths by municipality
Step 1: iterative model development
To facilitate model development we only use the median excess mortality by municipality, age group and sex in 2020.
data1 = exp_deaths_2020_year %>%
group_by(canton, GMDNR, GMDNAME, age_group, id_space, sex, munici_observed, munici_pop,
density_high, density_low, across(starts_with("sep")), border, lang_fr, lang_it,
across(starts_with("vote")),type_urban,type_rural,type_periurban) %>%
summarise(munici_exp_deaths=median(munici_exp_deaths),
munici_excess=median(munici_excess)) %>%
mutate(E=log(ifelse(munici_exp_deaths==0,1e-4,munici_exp_deaths))) %>%
ungroup()
rm(exp_deaths_2020_year)
# gc()hyper.iid = list(theta = list(prior = "pc.prec", param = c(1, 0.01)))
hyper.bym2 = list(theta1 = list("PCprior", c(1, 0.01)),
theta2 = list("PCprior", c(0.5, 0.5)))
threads = parallel::detectCores()Model 1.0: no covariates
We use a model structure similar to Poisson regression, where \(O_{t,i,j,k}\), the number of observed deaths during week \(t\) in municipality \(i\), age group \(j\) and sex group \(k\), depends on the number of expected deaths \(E_{t,i,j,k}\) based on historical data and a linear predictor \(\lambda\).
\[ O_i \sim \text{Poisson}(E_i \times \exp(\lambda)) \\ \] At start, the linear predictor \(\lambda\) only includes one intercept parameter \(\alpha\), so that the estimate of \(\exp(\alpha)\) can be interpreted as an average relative excess mortality for 2020. By adding covariates to \(\lambda\), we aim to disentangle the various factors that are associated with excess mortality at the local level.
We implement this model in R-INLA, a Bayesian inference package that is especially adapted to spatial data. This is achieved in practice by including \(\log (E_{i,j,k})\) as an offset (although an alternative formulation based on the E argument exists). During model development, we compare different model versions based on the WAIC (lower values imply a better fit).
model1.0 = INLA::inla(munici_observed ~ 1 + offset(E),
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.0)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 0.592, Running = 0.678, Post = 0.138, Total = 1.41
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
(Intercept) 0.325 0.004 0.317 0.325 0.332 0.325 0
Watanabe-Akaike information criterion (WAIC) ...: 49278.96
Effective number of parameters .................: 3.53
Marginal log-Likelihood: -24648.51
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
(Intercept) 1.383534 1.373679 1.39346
[1] 1.383562
As a sanity check, we find a relative excess mortality of 38% for 2020, that is coherent with a simple calculation (74,776 observed / 54,046 expected = 1.38). Remember that we excluded the age group 0-40, which explains why this is higher than numbers reported for Switzerland, generally around 10% for 2020. We can also look at the model fit and at the residuals. Obviously the model fit is not good here, as this basic model assumes a unique relative excess mortality for all areas, sexes and age groups.
Model 1.1: age and sex
We hypothesize that excess mortality affected different age and sex groups differently. We thus add the age group, the sex and the interaction of the two as covariates.
model1.1 = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.1)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 0.327, Running = 0.47, Post = 0.0686, Total = 0.865
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
sexFemale:age_group40-59 0.008 0.024 -0.040 0.008 0.055 0.008 0
sexMale:age_group40-59 0.354 0.018 0.318 0.354 0.390 0.354 0
sexFemale:age_group60-69 0.035 0.020 -0.003 0.035 0.074 0.035 0
sexMale:age_group60-69 0.417 0.015 0.388 0.417 0.447 0.417 0
sexFemale:age_group70-79 0.235 0.013 0.210 0.235 0.260 0.235 0
sexMale:age_group70-79 0.473 0.011 0.453 0.473 0.494 0.473 0
sexFemale:age_group80+ 0.493 0.006 0.481 0.493 0.504 0.493 0
sexMale:age_group80+ 0.149 0.007 0.136 0.149 0.163 0.149 0
Watanabe-Akaike information criterion (WAIC) ...: 47190.67
Effective number of parameters .................: 4.17
Marginal log-Likelihood: -23651.68
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
sexFemale:age_group40-59 1.007864 0.9612512 1.056738
sexMale:age_group40-59 1.424950 1.3745805 1.477166
sexFemale:age_group60-69 1.036069 0.9970809 1.076581
sexMale:age_group60-69 1.517741 1.4739324 1.562852
sexFemale:age_group70-79 1.264505 1.2334258 1.296368
sexMale:age_group70-79 1.605326 1.5724496 1.638889
sexFemale:age_group80+ 1.636631 1.6174162 1.656075
sexMale:age_group80+ 1.161138 1.1452712 1.177224
[1] -2088.29
As expected, the relative excess mortality varies a lot across age and sex groups. It’s very small in females aged 40-59 and 60-69 (in fact the data is compatible with no excess in both cases). It increases in females aged 70-79, and even more so aged 80+. It’s comparatively higher in males below 80, but somewhat surprisingly lower in males in age group 80+. We observe an improvement of the model fit, not easy to spot on the plot because of the large number of points, but made clear by the large decrease in WAIC.
Model 1.2: spatial variability
We now account for spatial variability, first in a simple way using an i.i.d. random effect, so that all municipalities can vary independently from each other around a global average.
model1.2 = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "iid"),
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.2)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 0.379, Running = 0.905, Post = 0.156, Total = 1.44
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
sexFemale:age_group40-59 0.011 0.024 -0.036 0.011 0.058 0.011 0
sexMale:age_group40-59 0.358 0.018 0.322 0.358 0.394 0.358 0
sexFemale:age_group60-69 0.039 0.020 0.001 0.039 0.078 0.039 0
sexMale:age_group60-69 0.420 0.015 0.391 0.420 0.450 0.420 0
sexFemale:age_group70-79 0.238 0.013 0.213 0.238 0.263 0.238 0
sexMale:age_group70-79 0.477 0.011 0.456 0.477 0.498 0.477 0
sexFemale:age_group80+ 0.497 0.006 0.485 0.497 0.509 0.497 0
sexMale:age_group80+ 0.153 0.007 0.139 0.153 0.167 0.153 0
Random effects:
Name Model
id_space IID model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 3453.45 2510.49 1339.89 2741.78 9707.17 2116.51
Watanabe-Akaike information criterion (WAIC) ...: 47159.19
Effective number of parameters .................: 14.49
Marginal log-Likelihood: -23646.50
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
sexFemale:age_group40-59 1.011058 0.9641761 1.060222
sexMale:age_group40-59 1.430421 1.3796297 1.483087
sexFemale:age_group60-69 1.039892 1.0006107 1.080718
sexMale:age_group60-69 1.522570 1.4783840 1.568084
sexFemale:age_group70-79 1.268978 1.2375430 1.301220
sexMale:age_group70-79 1.610709 1.5773914 1.644743
sexFemale:age_group80+ 1.643565 1.6234816 1.663948
sexMale:age_group80+ 1.165188 1.1488960 1.181732
[1] -31.47579
The age and sex effect remains similar, but the model fit as measured by the WAIC is improved now that we account for local differences. We can observe this municipality effect, that applies in all age and sex groups of the municipality in exactly the same way.
We find noisy estimates in some places, suggesting issues related to small area estimation. One solution is to partially pool information between municipalities that are geographically linked.
Model 1.3: structured spatial variability
We still focus on spatial variability, but now the municipalities are no longer independent: we account for the correlation between neighboring municipalities with a BYM model. This will allow us to differentiate between what can be attributed to a municipality in particular, and what can be attributed to regional effects (like a COVID wave).
model1.3 = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE),
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.3)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.7, Running = 5.24, Post = 0.401, Total = 14.3
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
sexFemale:age_group40-59 0.015 0.024 -0.032 0.015 0.063 0.015 0
sexMale:age_group40-59 0.362 0.018 0.326 0.362 0.398 0.362 0
sexFemale:age_group60-69 0.044 0.020 0.005 0.044 0.083 0.044 0
sexMale:age_group60-69 0.427 0.015 0.398 0.427 0.457 0.427 0
sexFemale:age_group70-79 0.243 0.013 0.218 0.243 0.269 0.243 0
sexMale:age_group70-79 0.482 0.011 0.461 0.482 0.503 0.482 0
sexFemale:age_group80+ 0.502 0.006 0.489 0.502 0.514 0.502 0
sexMale:age_group80+ 0.158 0.007 0.144 0.158 0.172 0.158 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 708.347 153.590 454.460 692.013 1056.612 660.247
Phi for id_space 0.976 0.033 0.885 0.987 0.999 0.997
Watanabe-Akaike information criterion (WAIC) ...: 46981.08
Effective number of parameters .................: 13.86
Marginal log-Likelihood: -22734.63
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
sexFemale:age_group40-59 1.015556 0.968369 1.065044
sexMale:age_group40-59 1.436466 1.385310 1.489515
sexFemale:age_group60-69 1.045072 1.005507 1.086196
sexMale:age_group60-69 1.533095 1.488404 1.579134
sexFemale:age_group70-79 1.275496 1.243725 1.308084
sexMale:age_group70-79 1.619881 1.586063 1.654431
sexFemale:age_group80+ 1.651269 1.630635 1.672203
sexMale:age_group80+ 1.171047 1.154361 1.187991
[1] -178.1088
We see that the structure accounts for about half of the spatial variability (Phi estimated to 0.5). This addition also improves the model fit as measured by the WAIC.
We observe that many of the municipalities with higher relative excess mortality are in the western and southern parts, the ones that were hit first by COVID-19 in 2020. We also observe areas with higher excess in the North and Northeastern parts. These largely correspond to areas that were hit the most during the first and the second COVID-19 waves of spring and fall 2020 (REF Konstantinoudis et al NatCom 2022).
Model 1.4: local characteristics
Having accounted for regional variability (arguably caused by COVID-19 waves of different timings and scales), we move on to explore the effect of local characteristics at the municipality level.
Rural/urban
The Federal Statistical Office classifies Swiss municipalities in 3 classes: urban, rural or intermediate (https://www.bfs.admin.ch/bfs/en/home/statistics/territory-environment/nomenclatures/gemtyp.html). We add this covariate to the model taking the “intermediate” category as the reference, and including an interaction with age.
model1.4a = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
type_periurban + type_urban,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.4a)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.43, Running = 2.73, Post = 0.388, Total = 11.5
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
type_periurban -0.032 0.013 -0.057 -0.032 -0.007 -0.032 0
type_urban -0.059 0.011 -0.080 -0.059 -0.037 -0.059 0
sexFemale:age_group40-59 0.055 0.026 0.005 0.055 0.106 0.055 0
sexMale:age_group40-59 0.402 0.020 0.363 0.402 0.442 0.402 0
sexFemale:age_group60-69 0.085 0.021 0.043 0.085 0.127 0.085 0
sexMale:age_group60-69 0.467 0.017 0.433 0.467 0.501 0.467 0
sexFemale:age_group70-79 0.284 0.015 0.254 0.284 0.314 0.284 0
sexMale:age_group70-79 0.523 0.014 0.496 0.523 0.550 0.523 0
sexFemale:age_group80+ 0.543 0.011 0.522 0.543 0.564 0.543 0
sexMale:age_group80+ 0.198 0.011 0.177 0.198 0.220 0.198 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 772.16 170.72 493.03 752.89 1162.14 714.89
Phi for id_space 1.00 0.00 1.00 1.00 1.00 1.00
Watanabe-Akaike information criterion (WAIC) ...: 46955.41
Effective number of parameters .................: 12.93
Marginal log-Likelihood: -22741.70
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
type_periurban 0.9684819 0.9446374 0.9929292
type_urban 0.9430452 0.9228926 0.9636496
sexFemale:age_group40-59 1.0568663 1.0049748 1.1114377
sexMale:age_group40-59 1.4953383 1.4369642 1.5560847
sexFemale:age_group60-69 1.0882576 1.0434694 1.1349688
sexMale:age_group60-69 1.5957263 1.5426347 1.6506476
sexFemale:age_group70-79 1.3285483 1.2890621 1.3692458
sexMale:age_group70-79 1.6872512 1.6424280 1.7333007
sexFemale:age_group80+ 1.7214371 1.6856810 1.7579568
sexMale:age_group80+ 1.2194751 1.1930976 1.2464389
[1] -25.67241
Results are not conclusive, but rural municipalities appear to have a slightly higher excess mortality than municipalities classified as intermediate or urban.
Socio-economic position
The Swiss neighbourhood index of socio-economic position provides an estimate of socio-economic position (SEP) based on census data for 1.5 million buildings [@panczak2023swiss]. We consider the median index of each municipality, then group municipalities in quintiles before adding to the model (reference is 3rd quintile). Again, we consider the interaction with age.
model1.4b = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
sep1 + sep2 + sep3 + sep4,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.4b)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.14, Running = 3.63, Post = 0.385, Total = 12.2
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
sep1 0.072 0.016 0.040 0.072 0.103 0.072 0
sep2 0.034 0.013 0.008 0.034 0.060 0.034 0
sep3 0.025 0.012 0.000 0.025 0.049 0.025 0
sep4 0.002 0.011 -0.020 0.002 0.024 0.002 0
sexFemale:age_group40-59 -0.006 0.025 -0.056 -0.006 0.044 -0.006 0
sexMale:age_group40-59 0.340 0.020 0.301 0.340 0.379 0.340 0
sexFemale:age_group60-69 0.023 0.021 -0.018 0.023 0.064 0.023 0
sexMale:age_group60-69 0.405 0.017 0.372 0.405 0.439 0.405 0
sexFemale:age_group70-79 0.222 0.015 0.192 0.222 0.251 0.222 0
sexMale:age_group70-79 0.461 0.013 0.435 0.461 0.487 0.461 0
sexFemale:age_group80+ 0.480 0.010 0.461 0.480 0.500 0.480 0
sexMale:age_group80+ 0.136 0.010 0.116 0.136 0.157 0.136 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 956.175 242.283 577.214 923.100 1524.822 858.019
Phi for id_space 0.961 0.039 0.854 0.973 0.998 0.993
Watanabe-Akaike information criterion (WAIC) ...: 46974.25
Effective number of parameters .................: 12.71
Marginal log-Likelihood: -22754.14
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
sep1 1.0746859 1.0412536 1.108992
sep2 1.0343348 1.0078248 1.061372
sep3 1.0251732 1.0003956 1.050423
sep4 1.0020254 0.9801477 1.024357
sexFemale:age_group40-59 0.9940357 0.9456242 1.044950
sexMale:age_group40-59 1.4051746 1.3511038 1.461464
sexFemale:age_group60-69 1.0232750 0.9818077 1.066527
sexMale:age_group60-69 1.4999135 1.4509096 1.550654
sexFemale:age_group70-79 1.2480005 1.2121209 1.285026
sexMale:age_group70-79 1.5858957 1.5456824 1.627289
sexFemale:age_group80+ 1.6166910 1.5859959 1.648239
sexMale:age_group80+ 1.1461998 1.1230294 1.170002
[1] -6.837997
A gradient appears clearly, but high uncertainty remains, so that we can conclude that municipalities of lowest median SEP (1st quintile) had a higher relative excess mortality in 2020 compared to municipalities of highest median SEP (5th quintile). As in other works, we observe that the gradient associated with SEP is less steep for older groups.
Borders
We now consider whether the municipality shares a border with another country.
model1.4c = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
border,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.4c)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.33, Running = 2.85, Post = 0.371, Total = 11.6
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
border 0.041 0.015 0.011 0.041 0.070 0.041 0
sexFemale:age_group40-59 0.008 0.024 -0.040 0.008 0.056 0.008 0
sexMale:age_group40-59 0.355 0.019 0.319 0.355 0.392 0.355 0
sexFemale:age_group60-69 0.037 0.020 -0.002 0.037 0.076 0.037 0
sexMale:age_group60-69 0.420 0.015 0.390 0.420 0.450 0.420 0
sexFemale:age_group70-79 0.236 0.013 0.210 0.236 0.262 0.236 0
sexMale:age_group70-79 0.475 0.011 0.453 0.475 0.497 0.475 0
sexFemale:age_group80+ 0.494 0.007 0.480 0.494 0.508 0.494 0
sexMale:age_group80+ 0.150 0.008 0.135 0.150 0.166 0.150 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 733.110 161.171 472.590 713.787 1104.173 674.729
Phi for id_space 0.965 0.035 0.871 0.976 0.998 0.994
Watanabe-Akaike information criterion (WAIC) ...: 46977.16
Effective number of parameters .................: 14.46
Marginal log-Likelihood: -22738.69
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
border 1.041472 1.0115449 1.072380
sexFemale:age_group40-59 1.007930 0.9608114 1.057363
sexMale:age_group40-59 1.426601 1.3753495 1.479769
sexFemale:age_group60-69 1.037441 0.9978187 1.078642
sexMale:age_group60-69 1.522199 1.4771990 1.568580
sexFemale:age_group70-79 1.266075 1.2338749 1.299129
sexMale:age_group70-79 1.607786 1.5731915 1.643163
sexFemale:age_group80+ 1.639002 1.6168112 1.661561
sexMale:age_group80+ 1.162313 1.1446724 1.180257
[1] -3.920832
We observe a tendency towards higher relative excess mortality in municipalities sharing a border with another country. However, this indicator is not entirely satisfying, as the level of connection with other countries is more of interest than just sharing a border.
Language
Most Swiss municipalities have one official language: German, French or Italian. A few municipalities have several official languages, but given the relatively low numbers, we consider only the majority language. The difficulty is the colinearity between language regions and the first COVID-19 wave of 2020, that primarily affected Ticino (Italian) and Southwestern Switzerland (French), mostly because of how the initial global spread of COVID-19 occurred (with large early epidemics in Italy and then France). These effects are much larger than any effect that could be attributed to cultural differences between language regions, so it is quite difficult to estimate the latter. We still attempt to do so by adding the language of each municipality (reference is German) to our model.
model1.4d = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
lang_fr + lang_it,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.4d)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.16, Running = 3.35, Post = 0.401, Total = 11.9
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
lang_fr 0.090 0.013 0.063 0.090 0.116 0.091 0
lang_it 0.153 0.022 0.110 0.154 0.196 0.154 0
sexFemale:age_group40-59 -0.021 0.025 -0.069 -0.021 0.028 -0.021 0
sexMale:age_group40-59 0.326 0.019 0.289 0.326 0.363 0.326 0
sexFemale:age_group60-69 0.007 0.020 -0.032 0.007 0.047 0.007 0
sexMale:age_group60-69 0.392 0.016 0.361 0.392 0.422 0.392 0
sexFemale:age_group70-79 0.206 0.013 0.180 0.206 0.233 0.206 0
sexMale:age_group70-79 0.446 0.011 0.423 0.446 0.468 0.446 0
sexFemale:age_group80+ 0.464 0.007 0.449 0.464 0.479 0.464 0
sexMale:age_group80+ 0.121 0.008 0.105 0.121 0.137 0.121 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 3107.871 1870.37 1064.846 2618.838 8051.989 1937.675
Phi for id_space 0.856 0.14 0.463 0.903 0.992 0.981
Watanabe-Akaike information criterion (WAIC) ...: 46967.71
Effective number of parameters .................: 8.91
Marginal log-Likelihood: -22719.47
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
lang_fr 1.094028 1.0650015 1.122499
lang_it 1.165839 1.1158181 1.216709
sexFemale:age_group40-59 0.979651 0.9336435 1.027950
sexMale:age_group40-59 1.385655 1.3353479 1.437917
sexFemale:age_group60-69 1.007406 0.9685883 1.047820
sexMale:age_group60-69 1.479263 1.4349687 1.525020
sexFemale:age_group70-79 1.228978 1.1970985 1.261826
sexMale:age_group70-79 1.561569 1.5271499 1.596961
sexFemale:age_group80+ 1.590278 1.5673892 1.614042
sexMale:age_group80+ 1.128295 1.1103044 1.146865
[1] -13.37184
At first sight, we may thing that there is a large effect of language region on excess mortality, with around 5-15% more deaths than expected in French-speaking municipalities and 15-30% more in Italian-speaking municipalities compared to German. However, as expected this association is likely confounded by the regional variability associated with COVID-19 waves in 2020. Indeed, if we now look at the geographically-structured municipality effect for this model, which can be interpreted as residual effects, we see that the higher excess in South and Southwestern Switzerland is now more evenly distributed (captured by the language effect), while French-speaking regions that were comparatively less impacted during the first wave (such as Neuchâtel and Jura) now have a negative municipality effect to compensate. These nonsensical results highlight the difficulty to estimate the effect of language regions. For this reason, in the following we rely upon observing the residual municipality effects to draw conclusion about the association with language rather than using the language as a fixed effect, as shown in the next map based on model 1.3.
In this last map, we can make two observations. First, French-speaking and Italian-speaking municipalities are not systematically more affected by excess mortality than German-speaking municipalities, with exceptions like the area around Neuchâtel and the Italian-speaking municipalities of Graubunden. Second, there is a clear separation between the French- and German-speaking municipalities
Referendums on COVID-19 measures
We now focus on results from two referendums about COVID-19 control measures held in June and November 2020. The point here is not to look at causality one way or the other, as we look at overall excess for 2020, and the voting took place at two separated points. A preliminary analysis has reported a negative association between the proportion of “yes” vote at the November referendum at the cantonal level and 7-day incidence on December 7, 2021 (https://smw.ch/index.php/smw/announcement/view/50). We classify municipalities according to the proportion of “yes” vote (expressing support of government-issued measures aimed at controlling COVID-19) at each vote, in quintiles (taking the 5th quintile - highest support - as a reference).
model1.4e = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
vote_jun_q1 + vote_jun_q2 + vote_jun_q3 + vote_jun_q4,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.4e)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.12, Running = 5.57, Post = 0.406, Total = 14.1
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
vote_jun_q1 0.045 0.015 0.015 0.045 0.075 0.045 0
vote_jun_q2 0.033 0.014 0.005 0.033 0.061 0.033 0
vote_jun_q3 0.021 0.013 -0.003 0.021 0.046 0.021 0
vote_jun_q4 0.011 0.011 -0.011 0.011 0.032 0.011 0
sexFemale:age_group40-59 0.000 0.025 -0.049 0.000 0.049 0.000 0
sexMale:age_group40-59 0.347 0.019 0.309 0.347 0.385 0.347 0
sexFemale:age_group60-69 0.029 0.021 -0.012 0.029 0.069 0.029 0
sexMale:age_group60-69 0.412 0.016 0.380 0.412 0.444 0.412 0
sexFemale:age_group70-79 0.229 0.014 0.201 0.229 0.256 0.229 0
sexMale:age_group70-79 0.467 0.012 0.443 0.467 0.492 0.467 0
sexFemale:age_group80+ 0.487 0.009 0.471 0.487 0.504 0.487 0
sexMale:age_group80+ 0.143 0.009 0.125 0.143 0.162 0.143 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 716.811 154.758 467.503 697.912 1073.940 659.137
Phi for id_space 0.979 0.024 0.911 0.986 0.999 0.997
Watanabe-Akaike information criterion (WAIC) ...: 46974.93
Effective number of parameters .................: 14.04
Marginal log-Likelihood: -22760.47
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
vote_jun_q1 1.045803 1.0148240 1.077758
vote_jun_q2 1.033525 1.0054039 1.062450
vote_jun_q3 1.021409 0.9966174 1.046814
vote_jun_q4 1.010716 0.9889815 1.032930
sexFemale:age_group40-59 1.000136 0.9522480 1.050440
sexMale:age_group40-59 1.414446 1.3615170 1.469447
sexFemale:age_group60-69 1.029318 0.9885591 1.071766
sexMale:age_group60-69 1.509569 1.4621682 1.558532
sexFemale:age_group70-79 1.256893 1.2225191 1.292260
sexMale:age_group70-79 1.595671 1.5575319 1.634788
sexFemale:age_group80+ 1.628032 1.6008960 1.655730
sexMale:age_group80+ 1.154020 1.1330395 1.175444
[1] -6.158043
model1.4f = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
vote_nov_q1 + vote_nov_q2 + vote_nov_q3 + vote_nov_q4,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.4f)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.23, Running = 3.61, Post = 0.394, Total = 12.2
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
vote_nov_q1 0.044 0.015 0.015 0.044 0.074 0.044 0
vote_nov_q2 0.043 0.013 0.017 0.043 0.070 0.043 0
vote_nov_q3 0.022 0.012 0.000 0.022 0.045 0.023 0
vote_nov_q4 0.017 0.011 -0.005 0.017 0.038 0.017 0
sexFemale:age_group40-59 -0.004 0.025 -0.053 -0.004 0.045 -0.004 0
sexMale:age_group40-59 0.343 0.019 0.305 0.343 0.381 0.343 0
sexFemale:age_group60-69 0.025 0.021 -0.015 0.025 0.065 0.025 0
sexMale:age_group60-69 0.408 0.016 0.376 0.408 0.440 0.408 0
sexFemale:age_group70-79 0.225 0.014 0.197 0.225 0.253 0.225 0
sexMale:age_group70-79 0.464 0.012 0.440 0.464 0.488 0.464 0
sexFemale:age_group80+ 0.484 0.008 0.467 0.484 0.500 0.484 0
sexMale:age_group80+ 0.140 0.009 0.122 0.140 0.158 0.140 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 779.782 175.240 497.773 758.375 1184.318 715.286
Phi for id_space 0.968 0.031 0.883 0.978 0.998 0.995
Watanabe-Akaike information criterion (WAIC) ...: 46974.75
Effective number of parameters .................: 13.61
Marginal log-Likelihood: -22758.78
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
vote_nov_q1 1.0454667 1.0149752 1.076855
vote_nov_q2 1.0444202 1.0174535 1.072063
vote_nov_q3 1.0227399 0.9996486 1.046299
vote_nov_q4 1.0167227 0.9950539 1.038837
sexFemale:age_group40-59 0.9961361 0.9485087 1.046165
sexMale:age_group40-59 1.4091182 1.3564892 1.463812
sexFemale:age_group60-69 1.0254959 0.9850317 1.067636
sexMale:age_group60-69 1.5040317 1.4570883 1.552522
sexFemale:age_group70-79 1.2522817 1.2182295 1.287322
sexMale:age_group70-79 1.5897262 1.5521200 1.628306
sexFemale:age_group80+ 1.6222166 1.5956901 1.649321
sexMale:age_group80+ 1.1498801 1.1293366 1.170873
[1] -6.335643
In both cases, high uncertainty remains, although it appears that excess mortality in age group 80+ appears to be consistently about 5% higher in municipalities expressing lowest support to control measures (first quantile) in both referendums.
Multivariable model
We now jointly estimate the effects of interest identified in the univariable analysis: rural or urban status, border, median SEP quintile and results from the COVID-19 referendums (using only the June referendum to limit complexity).
model1.5 = INLA::inla(munici_observed ~ - 1 + offset(E) +
sex:age_group +
f(id_space, model = "bym2", graph = "data/nb/gg_wm_q.adj", scale.model = TRUE,
hyper = hyper.bym2, constr=TRUE) +
border +
type_periurban + type_urban +
sep1 + sep2 + sep3 + sep4 +
vote_jun_q1 + vote_jun_q2 + vote_jun_q3 + vote_jun_q4,
data = data1,
family = "Poisson",
control.compute = list(config = TRUE, waic = TRUE),
quantiles = c(0.025, 0.5, 0.975),
num.threads = threads,
safe = TRUE)
summary(model1.5)
Call:
c("inla.core(formula = formula, family = family, contrasts = contrasts, ", " data = data,
quantiles = quantiles, E = E, offset = offset, ", " scale = scale, weights = weights,
Ntrials = Ntrials, strata = strata, ", " lp.scale = lp.scale, link.covariates =
link.covariates, verbose = verbose, ", " lincomb = lincomb, selection = selection,
control.compute = control.compute, ", " control.predictor = control.predictor,
control.family = control.family, ", " control.inla = control.inla, control.fixed =
control.fixed, ", " control.mode = control.mode, control.expert = control.expert, ", "
control.hazard = control.hazard, control.lincomb = control.lincomb, ", " control.update =
control.update, control.lp.scale = control.lp.scale, ", " control.pardiso =
control.pardiso, only.hyperparam = only.hyperparam, ", " inla.call = inla.call, inla.arg
= inla.arg, num.threads = num.threads, ", " blas.num.threads = blas.num.threads, keep =
keep, working.directory = working.directory, ", " silent = silent, inla.mode = inla.mode,
safe = FALSE, debug = debug, ", " .parent.frame = .parent.frame)")
Time used:
Pre = 8.41, Running = 3.83, Post = 0.434, Total = 12.7
Fixed effects:
mean sd 0.025quant 0.5quant 0.975quant mode kld
border 0.043 0.014 0.016 0.043 0.071 0.043 0
type_periurban -0.023 0.013 -0.049 -0.023 0.003 -0.023 0
type_urban -0.048 0.013 -0.073 -0.048 -0.022 -0.048 0
sep1 0.056 0.018 0.021 0.056 0.090 0.056 0
sep2 0.026 0.014 -0.003 0.026 0.054 0.026 0
sep3 0.019 0.013 -0.007 0.019 0.045 0.019 0
sep4 0.000 0.011 -0.022 0.000 0.022 0.000 0
vote_jun_q1 -0.008 0.018 -0.044 -0.008 0.028 -0.008 0
vote_jun_q2 -0.007 0.016 -0.039 -0.008 0.024 -0.008 0
vote_jun_q3 -0.005 0.014 -0.032 -0.005 0.022 -0.005 0
vote_jun_q4 -0.005 0.011 -0.027 -0.005 0.017 -0.005 0
sexFemale:age_group40-59 0.027 0.029 -0.029 0.027 0.084 0.027 0
sexMale:age_group40-59 0.374 0.024 0.327 0.374 0.422 0.374 0
sexFemale:age_group60-69 0.057 0.025 0.008 0.057 0.106 0.057 0
sexMale:age_group60-69 0.439 0.022 0.397 0.439 0.482 0.439 0
sexFemale:age_group70-79 0.256 0.020 0.216 0.256 0.295 0.256 0
sexMale:age_group70-79 0.495 0.019 0.458 0.495 0.532 0.495 0
sexFemale:age_group80+ 0.515 0.017 0.482 0.515 0.547 0.515 0
sexMale:age_group80+ 0.170 0.017 0.137 0.170 0.203 0.170 0
Random effects:
Name Model
id_space BYM2 model
Model hyperparameters:
mean sd 0.025quant 0.5quant 0.975quant mode
Precision for id_space 998.47 256.76 599.66 962.499 1603.503 891.710
Phi for id_space 0.96 0.04 0.85 0.972 0.997 0.993
Watanabe-Akaike information criterion (WAIC) ...: 46958.35
Effective number of parameters .................: 13.80
Marginal log-Likelihood: -22796.10
is computed
Posterior summaries for the linear predictor and the fitted values are computed
(Posterior marginals needs also 'control.compute=list(return.marginals.predictor=TRUE)')
mean 0.025quant 0.975quant
border 1.0443881 1.0156991 1.0739306
type_periurban 0.9771043 0.9519695 1.0028949
type_urban 0.9534305 0.9294926 0.9779838
sep1 1.0572317 1.0210039 1.0945124
sep2 1.0258589 0.9970622 1.0552796
sep3 1.0193663 0.9931238 1.0461396
sep4 0.9998385 0.9778917 1.0222444
vote_jun_q1 0.9919884 0.9569852 1.0284108
vote_jun_q2 0.9925411 0.9616492 1.0245207
vote_jun_q3 0.9947892 0.9686157 1.0217391
vote_jun_q4 0.9950804 0.9732749 1.0174220
sexFemale:age_group40-59 1.0276277 0.9713554 1.0871858
sexMale:age_group40-59 1.4542422 1.3873319 1.5244301
sexFemale:age_group60-69 1.0585346 1.0079405 1.1117016
sexMale:age_group60-69 1.5515998 1.4874597 1.6185796
sexFemale:age_group70-79 1.2911573 1.2416425 1.3427143
sexMale:age_group70-79 1.6404637 1.5812474 1.7019932
sexFemale:age_group80+ 1.6732965 1.6199343 1.7285487
sexMale:age_group80+ 1.1853712 1.1468813 1.2252393
[1] -22.73121
From this multivariate analysis, it appears that the only consistent association is with the median SEP of the municipality, and is especially marked age groups 40 to 79. There is also some indication that border municipalities and urban areas were associated with comparatively higher excess mortality in 2020, but the uncertainty remains high. Estimates of an association with voting results are faint. There are also some interesting patterns in the residual effects at the level of the municipality (adjusting for all aforementioned covariates), with in particular, expected higher excesses in Ticino and Southwestern Switzerland, a visible language barrier between French-speaking and German-speaking regions, lower excess in the large cities of the German-speaking part (Zurich, Basel, Bern) and in relatively isolated valleys of Graubunden.